package com.huangsm.concurrence.concurrentmap;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * @author huang
 * @date 2019/2/14
 */
@Slf4j
public class ConcurrentHashMapDemo {
    /**
     * ConcurrentHashMap 和 java.util.HashTable 类很相似，但 ConcurrentHashMap 能够提供比 HashTable 更好的并发性能。
     * 在你从中读取对象的时候 ConcurrentHashMap 并不会把整个 Map 锁住。此外，在你向其中写入对象的时候，ConcurrentHashMap 也不会锁住整个 Map。
     * 它的内部只是把 Map 中正在被写入的部分进行锁定。
     * 另外一个不同点是，在被遍历的时候，即使是 ConcurrentHashMap 被改动，它也不会抛 ConcurrentModificationException。尽管 Iterator 的设计不是为多个线程的同时使用。
     */
    public static void main(String[] args) {

        ConcurrentMap<String,Integer> concurrentMap = new ConcurrentHashMap<String, Integer>(20);

        concurrentMap.put("a", 1);
        concurrentMap.put("b",2);
        concurrentMap.put("c",3);
        for (String s : concurrentMap.keySet()) {
            log.info(concurrentMap.get(s)+"");
            concurrentMap.put("d",4);
        }
        Runnable r=()-> concurrentMap.put("e",5);
        r.run();
         ((ConcurrentHashMap<String, Integer>) concurrentMap).keySet().forEach(s->{
            System.out.println(concurrentMap.get(s));}
        );
    }
}
